/**
 * 常用的线程方法
 */
public class CommonMethod {
    public static void main(String[] args) throws InterruptedException {
        // 若没有给线程设置名字，会有一个默认值 Thread-x（序号，从0开始）
        // 设置名称可以通过set方法或者构造方法
        MyThread t1 = new MyThread("线程一");
        MyThread t2 = new MyThread("线程二");
        t1.start();
        t2.start();


        // 获取当前执行的线程
        Thread thread = Thread.currentThread();
        // 解释：当JVM虚拟机启动之后，会自动启动多条线程，其中一条就叫main线程
        //      他的作用就是去调用main方法，并执行里面的代码
        System.out.println(thread.getName());


        // 睡眠
        Thread.sleep(1000);


        // 线程的优先级，范围1~10
        // 默认是5，优先级越多，越容易抢占CPU，并不是绝对的，只是概率问题
        // 应用场景：QQ聊天，一边聊天一边传文件，当聊天结束，文件传输就自动结束
        System.out.println(t1.getPriority());
        t1.setPriority(10);
        t2.setPriority(5);


        // 守护线程【备胎线程】
        // 特点：当女神线程结束，守护线程就没必要继续执行了会自动结束，也就是说myThread2线程遍历不到100。
        MyThread1 myThread1 = new MyThread1("女神");
        MyThread2 myThread2 = new MyThread2("备胎");
        myThread2.setDaemon(true);
        myThread1.start();
        myThread2.start();


        // 出让/礼让线程
        // 细节：让出CPU的执行权后，并不一定能够保证下次执行不是自己
        MyThread3 myThread3 = new MyThread3();
        myThread3.start();


        // 插入线程
        // 表示t1线程插入到t2线程之前，t1线程执行完才执行t2
        t1.start();
        t1.join();
        t2.start();


    }

    static class MyThread1 extends Thread {
        @Override
        public void run() {
            String name = getName();
            for (int i = 0; i < 10; i++) {
                System.out.println(name + i);
            }
        }

        // 构造方法传递name
        public MyThread1(String name) {
            super(name);
        }
    }

    static class MyThread2 extends Thread {
        @Override
        public void run() {
            String name = getName();
            for (int i = 0; i < 100; i++) {
                System.out.println(name + i);
            }
        }

        // 构造方法传递name
        public MyThread2(String name) {
            super(name);
        }
    }

    static class MyThread extends Thread {
        @Override
        public void run() {
            String name = getName();
            for (int i = 0; i < 100; i++) {
                System.out.println(name + i);
            }
        }

        // 构造方法传递name
        public MyThread(String name) {
            super(name);
        }
    }

    static class MyThread3 extends Thread {
        @Override
        public void run() {
            String name = getName();
            for (int i = 0; i < 100; i++) {
                System.out.println(name + i);
                // 表示让出CPU的执行权
                Thread.yield();
            }
        }
    }
}